import os
import sys
import math
import random
from io import BytesIO, IOBase
f = 1
def isPal(s):
i = 0
j = len(s) - 1
while(i < j):
if s[i] != s[j]:
return False
i += 1
j -= 1
return True
def solve():
n = int(input())
s = input()
ans = 0
temp = ""
i = 0
while(i < n):
temp += s[i]
if len(temp) > 1:
if isPal(temp) == True:
ans += 1
temp = ""
else:
if temp == "(" and i != n-1 and s[i+1] == ")":
ans += 1
temp = ""
i += 1
i += 1
print(ans, len(temp))
BUFSIZE = 8192
class FastIO(IOBase):
newlines = 0
def __init__(self, file):
self._fd = file.fileno()
self.buffer = BytesIO()
self.writable = "x" in file.mode or "r" not in file.mode
self.write = self.buffer.write if self.writable else None
def read(self):
while True:
b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
if not b:
break
ptr = self.buffer.tell()
self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
self.newlines = 0
return self.buffer.read()
def readline(self):
while self.newlines == 0:
b = os.read(self._fd, max(os.fstat(self._fd).st_size, BUFSIZE))
self.newlines = b.count(b"\n") + (not b)
ptr = self.buffer.tell()
self.buffer.seek(0, 2), self.buffer.write(b), self.buffer.seek(ptr)
self.newlines -= 1
return self.buffer.readline()
def flush(self):
if self.writable:
os.write(self._fd, self.buffer.getvalue())
self.buffer.truncate(0), self.buffer.seek(0)
class IOWrapper(IOBase):
def __init__(self, file):
self.buffer = FastIO(file)
self.flush = self.buffer.flush
self.writable = self.buffer.writable
self.write = lambda s: self.buffer.write(s.encode("ascii"))
self.read = lambda: self.buffer.read().decode("ascii")
self.readline = lambda: self.buffer.readline().decode("ascii")
sys.stdin, sys.stdout = IOWrapper(sys.stdin), IOWrapper(sys.stdout)
input = lambda: sys.stdin.readline().rstrip("\r\n")
if(os.path.exists('input.txt')):
sys.stdin = open("input.txt","r")
sys.stdout = open("output.txt","w")
if __name__ == "__main__":
if f == 1:
t = int(input())
while(t):
solve(); t -= 1
else: solve()
#include<bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define endl '\n'
#define pb push_back
#define IOS ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
using namespace std;
const int N = 2e5+5;
using LL = long long;
vector <char> st1, st2;
void solve(){
int n;
string s;
cin >> n >> s;
// cout << n << endl << s << endl;
st1.clear();
st2.clear();
int idx1 = 0, idx2 = 0, cnt = 0;
while(idx2 < n){
if(st1.empty() || st2.empty()){
st1.pb(s[idx2]);
st2.pb(s[idx2]);
idx2++;
continue;
}
if(st1.size() > 0 && s[idx2] == ')' && st1.back() == '(' )st1.pop_back();
else st1.pb(s[idx2]);
if(s[idx2] == st2.back())st2.pop_back();
else st2.pb(s[idx2]);
if(st1.size() == 0 || st2.size() == 0 || (st2.size() == 3 && st2.front() == st2.back())){
cnt++;
idx1 = idx2;
st1.clear();
st2.clear();
}
idx2++;
}
if(idx1 == 0)cout << 0 << " " <<n << endl;
else cout << cnt << " " << n-idx1-1 << endl;
}
int main(){
IOS
int T;
cin >> T;
while(T--)solve();
return 0;
}
1302. Deepest Leaves Sum | 1209. Remove All Adjacent Duplicates in String II |
994. Rotting Oranges | 983. Minimum Cost For Tickets |
973. K Closest Points to Origin | 969. Pancake Sorting |
967. Numbers With Same Consecutive Differences | 957. Prison Cells After N Days |
946. Validate Stack Sequences | 921. Minimum Add to Make Parentheses Valid |
881. Boats to Save People | 497. Random Point in Non-overlapping Rectangles |
528. Random Pick with Weight | 470. Implement Rand10() Using Rand7() |
866. Prime Palindrome | 1516A - Tit for Tat |
622. Design Circular Queue | 814. Binary Tree Pruning |
791. Custom Sort String | 787. Cheapest Flights Within K Stops |
779. K-th Symbol in Grammar | 701. Insert into a Binary Search Tree |
429. N-ary Tree Level Order Traversal | 739. Daily Temperatures |
647. Palindromic Substrings | 583. Delete Operation for Two Strings |
518. Coin Change 2 | 516. Longest Palindromic Subsequence |
468. Validate IP Address | 450. Delete Node in a BST |